#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <stdbool.h>
#include "dnsconf.h"

static bool setSerialNo(char * offset, char * serial_no);

void help(void) {
	printf("\t-s <1234567890>\taktualizacja serial number strefy\n");
	printf("\t-h\twyswietla ta pomoc\n");
}
bool serial_update(const char * filename, char * new_serial) {
	int zone;
	char *m_zone;

	struct stat info;

	if((zone = open(filename, O_RDWR)) == -1) {
		switch(errno) {
			case EACCES : perror("Access Denied"); break;
			case EBADF : perror("File not found"); break;
			default : perror("open");
		}
		return false;
	}
	if(fstat(zone, &info) == -1) {
		perror("fstat");
		return false;
	}
	if(!S_ISREG(info.st_mode)) {
		fprintf(stderr, "%s nie jest plikiem regularnym\n", filename);
		return false;
	}
	if((m_zone = mmap(0, info.st_size, PROT_WRITE, MAP_SHARED, zone, 0)) == MAP_FAILED) {
		switch(errno) {
			case EACCES : perror("Access denied"); break;
			case ENOMEM : perror("Brak pamieci"); break;
			case EOVERFLOW: perror("Problem z zaadresowaniem pamieci"); break;
			default : perror("mmap error");
		}
	}
	setSerialNo(&m_zone[SERIAL_OFFSET], new_serial);
	if(close(zone)) {
		perror("close error");
		return false;
	}
	return true;
}
static bool setSerialNo(char * offset, char * serial_no) {
	char old_serial[SERIAL_LEN+1];
	int i;

	for(i=0; i < SERIAL_LEN; i++)
		old_serial[i] = offset[i];
	old_serial[i] = '\0';
	if(atol(old_serial) < atol(serial_no)) {
		for(i=0; i < SERIAL_LEN; i++)
			offset[i] = serial_no[i];
		return true;
	}
	else {
		fputs("Bledny serial\n", stderr);
		return false;
	}
}
